home *** CD-ROM | disk | FTP | other *** search
- 10 REM *** A Blob of Tetrahedrons & Octahedrons ***
- 20 REM
- 30 REM The principle: you have two rooms, one filled with cells
- 40 REM made of two tetras and and one octa, the other one filled with
- 50 REM the normal cubes. You transform a point from the tetra space
- 60 REM into the normal space. After that you calculate if this point
- 70 REM belongs to the blob storing this information with the original
- 80 REM (tetra-) coordinates. In a second loop you draw the tetras &
- 90 REM octas depending on the status of their corner points.
- 100 REM
- 110 REM (The idea comes from another M.C. Escher picture;
- 120 REM I could not find a translation of its title in my dictionary.
- 130 REM In German it is called "Plattwurmer")
- 140 REM
- 150 REM Init the size of the tetra space, scaling constant
- 160 LET SIZE=24
- 170 LET DT=0.05
- 180 LET SIZ2=SIZE/2
- 190 REM Allocate memory for the tetra space: bit field
- 200 DIM BIT BF[SIZE][SIZE][SIZE]
- 210 REM Allocate memory for corner points of tetra space: vector field
- 220 DIM CP^[4]
- 230 REM Create the right-hand coordinate system of tetra space
- 240 LET SX^=VX
- 250 LET SY^=<0.5,0,SQRT(3)/2>
- 260 LET SZ^=<0.5,-SQRT(2/3),0.5/SQRT(3)>
- 270 LET XX^=-SZ^
- 280 LET YY^=SX^-SZ^
- 290 LET ZZ^=SY^-SZ^
- 300 LET CP^[1]= TRANSFORM (<-1,1,-1>,XX^,YY^,ZZ^)
- 310 LET CP^[2]= TRANSFORM (<-1,1,1>,XX^,YY^,ZZ^)
- 320 LET CP^[3]= TRANSFORM (<1,1,-1>,XX^,YY^,ZZ^)
- 330 LET CP^[4]= TRANSFORM (<1,1,1>,XX^,YY^,ZZ^)
- 340 REM Calculate the angle-dependent norming constant for tetra space:
- 350 REM It is the maximum expansion of the tetra space in X,Y or Z
- 360 REM direction.
- 370 LET TSCALE=0
- 380 FOR I=1 TO 4
- 390 IF VX(CP^[I])>TSCALE THEN TSCALE=VX(CP^[I])
- 400 IF VY(CP^[I])>TSCALE THEN TSCALE=VY(CP^[I])
- 410 IF VZ(CP^[I])>TSCALE THEN TSCALE=VZ(CP^[I])
- 420 NEXT I
- 430 LET TS=TSCALE/SIZ2
- 440 PRINT "Overhead factor ca.",TSCALE
- 450 REM
- 460 REM The loop: calculate the setting information and store it into
- 470 REM the bit field. Points not fitting into the normal 1,1,1 cube
- 480 REM are not considered.
- 490 REM
- 500 FOR Z=1 TO SIZE
- 510 FOR Y=1 TO SIZE
- 520 FOR X=1 TO SIZE
- 530 GOSUB 2230
- 540 GOSUB 2300
- 550 NEXT X
- 560 NEXT Y
- 570 PRINT "*"
- 580 NEXT Z
- 590 REM
- 600 REM Define two tetras and one octa using the XX^,YY^,ZZ^
- 610 REM (Thus, you can create "distorted" tetras & octas using
- 620 REM your own definitions for these vectors)
- 630 REM
- 640 PRINT "Tetrahedrons & Octahedrons"
- 650 DELETE TX1$
- 660 LET TX1$="MyTex1"
- 670 DELETE TX2$
- 680 LET TX2$="MyTex2"
- 690 DELETE TX3$
- 700 LET TX3$="MyTex3"
- 710 LET A^=V0
- 720 LET B^=XX^
- 730 LET C^=YY^
- 740 LET D^=ZZ^
- 750 GOSUB 1470
- 760 LET TETRA_A$=TETRA$
- 770 TEX TETRA_A$=TX1$
- 780 LET A^=YY^+ZZ^
- 790 LET B^=XX^+YY^+ZZ^
- 800 LET C^=XX^+ZZ^
- 810 LET D^=XX^+YY^
- 820 GOSUB 1470
- 830 LET TETRA_B$=TETRA$
- 840 TEX TETRA_B$=TX2$
- 850 LET A^=YY^
- 860 LET B^=XX^+YY^
- 870 LET C^=YY^+ZZ^
- 880 LET D^=XX^
- 890 LET E^=ZZ^
- 900 LET F^=XX^+ZZ^
- 910 GOSUB 1730
- 920 TEX OCTA$=TX3$
- 930 DELETE "tetra.inc"
- 940 LET T_A$="Tetra_A"
- 950 REM Calculate bounding shapes for 2 tetras & 1 octa
- 960 REM and save the declarations
- 970 BOUND T_A$= BOUND TETRA_A$
- 980 DELETE BOUND TETRA_A$
- 990 LET T_B$="Tetra_B"
- 1000 BOUND T_B$= BOUND TETRA_B$
- 1010 DELETE BOUND TETRA_B$
- 1020 LET OCT$="Octa"
- 1030 BOUND OCT$= BOUND OCTA$
- 1040 DELETE BOUND OCTA$
- 1050 FPRINT "#declare Tetra_A = ",TETRA_A$
- 1060 FPRINT "#declare Tetra_B = ",TETRA_B$
- 1070 FPRINT "#declare Octa = ",OCTA$
- 1080 REM
- 1090 REM Evaluate setting information and write the tetra & octa grid
- 1100 REM The PXXX points contain the corner information of one
- 1110 REM cell of the tetra space
- 1120 REM
- 1130 PRINT "Writing Crystal"
- 1140 FOR Z=1 TO SIZE-1
- 1150 FOR Y=1 TO SIZE-1
- 1160 LET FLAG=0
- 1170 FOR X=1 TO SIZE-1
- 1180 LET P010= BIT BF[X][Y+1][Z]
- 1190 LET P011= BIT BF[X][Y+1][Z+1]
- 1200 IF !(P010||P011) THEN GOTO 1300
- 1210 LET P000= BIT BF[X][Y][Z]
- 1220 LET P001= BIT BF[X][Y][Z+1]
- 1230 LET P100= BIT BF[X+1][Y][Z]
- 1240 LET P101= BIT BF[X+1][Y][Z+1]
- 1250 LET P110= BIT BF[X+1][Y+1][Z]
- 1260 LET P111= BIT BF[X+1][Y+1][Z+1]
- 1270 IF P000&&P100&&P001&&P010 THEN GOSUB 2090
- 1280 IF P110&&P011&&P101&&P111 THEN GOSUB 2110
- 1290 IF P001&&P010&&P011&&P100&&P101&&P110 THEN GOSUB 2130
- 1300 NEXT X
- 1310 IF !FLAG THEN GOTO 1360
- 1320 BOUND A$
- 1330 FPRINT A$
- 1340 DELETE A$
- 1350 LET FLAG=0
- 1360 REM
- 1370 NEXT Y
- 1380 PRINT "Step: ",Z
- 1390 NEXT Z
- 1400 END
- 1410 REM
- 1420 REM
- 1430 REM Sub-routines
- 1440 REM
- 1450 REM
- 1460 REM
- 1470 REM Tetrahedron
- 1480 LET T1$=PLANE(A^,B^,C^)
- 1490 LET T2$=PLANE(A^,C^,D^)
- 1500 LET T3$=PLANE(A^,D^,B^)
- 1510 LET T4$=PLANE(B^,D^,C^)
- 1520 LET P1$=PLANE(A^+DT*(C^-A^),(A^-B^)#(D^-C^))
- 1530 LET P2$=PLANE(A^+DT*(D^-A^),(A^-C^)#(B^-D^))
- 1540 LET P3$=PLANE(A^+DT*(B^-A^),(A^-D^)#(C^-B^))
- 1550 LET P4$=PLANE(B^+DT*(D^-B^),(C^-B^)#(A^-D^))
- 1560 LET P5$=PLANE(B^+DT*(C^-B^),(B^-D^)#(A^-C^))
- 1570 LET P6$=PLANE(C^+DT*(B^-C^),(C^-D^)#(B^-A^))
- 1580 LET M^=1/4*(A^+B^+C^+D^)
- 1590 LET RAD=ABS(M^-A^)
- 1600 IF ABS(M^-B^)>RAD THEN RAD=ABS(M^-B^)
- 1610 IF ABS(M^-C^)>RAD THEN RAD=ABS(M^-C^)
- 1620 IF ABS(M^-D^)>RAD THEN RAD=ABS(M^-D^)
- 1630 DELETE BD$
- 1640 LET BD$="sphere { <0,0,0> 1 }"
- 1650 LET BD$=SCALE(BD$,<RAD,RAD,RAD>)
- 1660 LET BD$=TRANSLATE(BD$,M^)
- 1670 LET TETRA$=SECT(T1$,T2$,T3$,T4$,P1$,P2$,P3$,P4$,P5$,P6$)
- 1680 BOUND TETRA$=BD$
- 1690 RETURN
- 1700 REM
- 1710 REM
- 1720 REM
- 1730 REM Octahedron
- 1740 LET T1$=PLANE(A^,B^,C^)
- 1750 LET T2$=PLANE(D^,E^,F^)
- 1760 LET T3$=PLANE(A^,E^,D^)
- 1770 LET T4$=PLANE(E^,A^,C^)
- 1780 LET T5$=PLANE(C^,F^,E^)
- 1790 LET T6$=PLANE(F^,C^,B^)
- 1800 LET T7$=PLANE(B^,D^,F^)
- 1810 LET T8$=PLANE(D^,B^,A^)
- 1820 LET P1$=PLANE(A^+DT*(C^-A^),(A^-B^)#(D^-C^))
- 1830 LET P2$=PLANE(A^+DT*(D^-A^),(A^-C^)#(B^-E^))
- 1840 LET P3$=PLANE(A^+DT*(E^-A^),(A^-D^)#(E^-B^))
- 1850 LET P4$=PLANE(A^+DT*(B^-A^),(A^-E^)#(C^-D^))
- 1860 LET P5$=PLANE(B^+DT*(D^-B^),(B^-C^)#(F^-A^))
- 1870 LET P6$=PLANE(B^+DT*(F^-B^),(B^-D^)#(A^-F^))
- 1880 LET P7$=PLANE(B^+DT*(C^-B^),(B^-F^)#(D^-C^))
- 1890 LET P8$=PLANE(C^+DT*(F^-C^),(C^-E^)#(F^-A^))
- 1900 LET P9$=PLANE(C^+DT*(E^-C^),(C^-F^)#(B^-E^))
- 1910 LET PA$=PLANE(D^+DT*(F^-D^),(D^-E^)#(A^-F^))
- 1920 LET PB$=PLANE(D^+DT*(E^-D^),(D^-F^)#(E^-B^))
- 1930 LET PC$=PLANE(E^+DT*(C^-E^),(E^-F^)#(C^-D^))
- 1940 LET M^=1/6*(A^+B^+C^+D^+E^+F^)
- 1950 LET RAD=ABS(M^-A^)
- 1960 IF ABS(M^-B^)>RAD THEN RAD=ABS(M^-B^)
- 1970 IF ABS(M^-C^)>RAD THEN RAD=ABS(M^-C^)
- 1980 IF ABS(M^-D^)>RAD THEN RAD=ABS(M^-D^)
- 1990 IF ABS(M^-E^)>RAD THEN RAD=ABS(M^-E^)
- 2000 IF ABS(M^-F^)>RAD THEN RAD=ABS(M^-F^)
- 2010 DELETE BD$
- 2020 LET BD$="sphere { <0,0,0> 1}"
- 2030 LET BD$=SCALE(BD$,<RAD,RAD,RAD>)
- 2040 LET BD$=TRANSLATE(BD$,M^)
- 2050 LET OCTA$=SECT(T1$,T2$,T3$,T4$,T5$,T6$,T7$,T8$)
- 2060 LET OCTA$=SECT(OCTA$,P1$,P2$,P3$,P4$,P5$,P6$,P7$,P8$,P9$,PA$,PB$,PC$)
- 2070 BOUND OCTA$=BD$
- 2080 RETURN
- 2090 LET B$=T_A$
- 2100 GOTO 2140
- 2110 LET B$=T_B$
- 2120 GOTO 2140
- 2130 LET B$=OCT$
- 2140 GOSUB 2230
- 2150 LET B$=SCALE(B$,<TS,TS,TS>)
- 2160 LET B$=BP^
- 2170 IF !FLAG THEN GOTO 2200
- 2180 LET A$=ADDOBJ(A$,B$)
- 2190 RETURN
- 2200 LET A$=B$
- 2210 LET FLAG=1
- 2220 RETURN
- 2230 REM Transformation
- 2240 LET FP^=TSCALE*(1/SIZ2*<X-1,Y-1,Z-1>-<1,1,1>)
- 2250 LET BP^= TRANSFORM #(FP^,XX^,YY^,ZZ^)
- 2260 RETURN
- 2270 REM
- 2280 REM
- 2290 REM
- 2300 REM Blob function
- 2310 LET A=0
- 2320 IF ABS(VX(BP^))>1||ABS(VY(BP^))>1||ABS(VZ(BP^))>1 THEN GOTO 2340
- 2330 GOSUB 2420
- 2340 BIT BF[X][Y][Z]=A
- 2350 RETURN
- 2360 REM Blob density function
- 2370 LET RR=ABS(BP^-C^)
- 2380 IF RR>RAD THEN RETURN
- 2390 LET DENS=DENS+STR*SQR(1-SQR(RR/RAD))
- 2400 RETURN
- 2410 REM Blob
- 2420 LET RAD=1
- 2430 LET STR=1
- 2440 LET DENS=0
- 2450 LET C^=<0.75,0,0>
- 2460 GOSUB 2370
- 2470 LET C^=<-0.375,0.64952,0>
- 2480 GOSUB 2370
- 2490 LET C^=<-0.375,-0.64952,0>
- 2500 GOSUB 2370
- 2510 LET A=DENS>=0.6
- 2520 RETURN
-